#include "stdio.h"
#include "stdlib.h"

#include "iostream"

#define MAXSIZE 5

using namespace std;

typedef struct
{
    char data[MAXSIZE];
    int front,rear;
}SqCircularQueue;

//初始化循环队列
void initQueue(SqCircularQueue *&q)
{
    q=(SqCircularQueue *)malloc(sizeof(SqCircularQueue));
    q->front=q->rear=0;
}

//销毁循环队列
void destroyQueue(SqCircularQueue *&q)
{
    free(q);
}

//判断循环队列是否为空
bool emptyQueue(SqCircularQueue *q)
{
    return q->front==q->rear;
}

//循环队列进队列操作
bool enQueue(SqCircularQueue *q,char e)
{
    if((q->rear+1)%MAXSIZE==q->front)
        return false;
    q->rear=(q->rear+1)%MAXSIZE;
    q->data[q->rear]=e;
    return true;
}

//循环队列出队列操作
bool deQueue(SqCircularQueue *q,char &e)
{
    if(q->front==q->rear)
        return false;
    q->front=(q->front+1)%MAXSIZE;
    e=q->data[q->front];
    return true;
}

//循环队列元素个数
int sizeQueue(SqCircularQueue *q)
{
    return (q->rear-q->front+MAXSIZE)%MAXSIZE;
}



int main()
{
    SqCircularQueue *cq;
    char c;

    initQueue(cq);
    cout<<"循环队列是否为空:"<<boolalpha<<emptyQueue(cq)<<endl;

    printf("\n进队列操作\n");
    if(enQueue(cq,'a'))
        printf("a进入循环队列成功\n");
    else
        printf("a进入循环队列失败\n");

    if(enQueue(cq,'b'))
        printf("b进入循环队列成功\n");
    else
        printf("b进入循环队列失败\n");

    if(enQueue(cq,'c'))
        printf("c进入循环队列成功\n");
    else
        printf("c进入循环队列失败\n");

    if(enQueue(cq,'d'))
        printf("d进入循环队列成功\n");
    else
        printf("d进入循环队列失败\n");

    if(enQueue(cq,'e'))
        printf("e进入循环队列成功\n");
    else
        printf("e进入循环队列失败\n");


    printf("队列元素个数:%d\n",sizeQueue(cq));


    printf("\n出队列操作\n");
    if(deQueue(cq,c))
        printf("%c出循环队列成功\n",c);
    else
        printf("出循环队列失败\n");

    if(deQueue(cq,c))
        printf("%c出循环队列成功\n",c);
    else
        printf("出循环队列失败\n");

    printf("队列元素个数:%d\n",sizeQueue(cq));

    printf("\n进队列操作\n");
    if(enQueue(cq,'e'))
        printf("e进入循环队列成功\n");
    else
        printf("e进入循环队列失败\n");

     printf("队列元素个数:%d\n",sizeQueue(cq));

     if(enQueue(cq,'f'))
        printf("f进入循环队列成功\n");
     else
        printf("f进入循环队列失败\n");

     printf("队列元素个数:%d\n",sizeQueue(cq));

     if(enQueue(cq,'g'))
        printf("g进入循环队列成功\n");
     else
        printf("g进入循环队列失败\n");

     printf("队列元素个数:%d\n",sizeQueue(cq));


    destroyQueue(cq);
}
